<?php

/**
 * @name SBShop
 * @author Mukharev Maxim
 * @version 0.1a
 * 
 * @desription
 * 
 * Электронный магазин для MODx
 * 
 * Экшен сниппета электронного магазина: Вывод товара
 * 
 */

class product_mode {
	
	protected $aTemplates; // Массив с набором шаблонов
	
	/**
	 * Конструктор
	 */
	public function __construct($sMode) {
		global $modx;
		/**
		 * Задаем набор шаблонов
		 */
		$sTemplate = $modx->sbshop->getSnippetTemplate('product');
		/**
		 * Разбиваем шаблон на части
		 */
		list($sProduct,$sAbsentProduct,$sOuterTmb,$sRowTmb,$sOuterAttr,$sRowAttr,$sOuterOpts,$sOuterOpt,$sRowSimpleOpt,$sRowMultOpt,$sOuterBundl,$sRowBundl,$sOuterBundlOpt,$sRowBundlOpt,$sVariantsOuter,$sVariantsRow) = explode('<!-- ### -->',$sTemplate);
		/**
		 * Устанавливаем шаблоны
		 */
		$this->aTemplates['product'] = $sProduct;
		$this->aTemplates['absent_product'] = $sAbsentProduct;
		$this->aTemplates['thumbs_outer'] = $sOuterTmb;
		$this->aTemplates['thumbs_row'] = $sRowTmb;
		$this->aTemplates['attribute_outer'] = $sOuterAttr;
		$this->aTemplates['attribute_row'] = $sRowAttr;
		$this->aTemplates['options_outer'] = $sOuterOpts;
		$this->aTemplates['option_outer'] = $sOuterOpt;
		$this->aTemplates['simple_option_row'] = $sRowSimpleOpt;
		$this->aTemplates['multi_option_row'] = $sRowMultOpt;
		$this->aTemplates['bundling_outer'] = $sOuterBundl;
		$this->aTemplates['bundling_row'] = $sRowBundl;
		$this->aTemplates['bundling_option_outer'] = $sOuterBundlOpt;
		$this->aTemplates['bundling_option_row'] = $sRowBundlOpt;
		$this->aTemplates['variants_outer'] = $sVariantsOuter;
		$this->aTemplates['variants_row'] = $sVariantsRow;
		/**
		 * Вывод списка товаров
		 */
		$modx->setPlaceholder('sb.product',$this->outputProduct());
		
	}
	
	/**
	 * Вывод списка товаров для текущей категории
	 */
	public function outputProduct() {
		global $modx;
		/**
		 * Инициализируем переменную для вывода результата
		 */
		$sOutput = '';
		/**
		 * Установка заголовка страницы
		 */
		$modx->setPlaceholder('sb.product.title',$modx->sbshop->oGeneralProduct->getAttribute('title'));
		/**
		 * Получение плейсхолдеров товара
		 */
		$aRepl = $modx->sbshop->arrayToPlaceholders($modx->sbshop->oGeneralProduct->getAttributes());
		/**
		 * Если установлен параметр "Есть в наличии"
		 */
		if($modx->sbshop->oGeneralProduct->getAttribute('existence')) {
			/**
			 * Устанавливаем заголовок "есть в наличии" из языкового файла
			 */
			$aRepl['[+sb.existence+]'] = $modx->sbshop->lang['product_existence_title'];
		} else {
			/**
			 * Устанавливаем заголовок "нет в наличии" из языкового файла
			 */
			$aRepl['[+sb.existence+]'] = $modx->sbshop->lang['product_notexistence_title'];
		}
		/**
		 * Обрабатываем описание и делим на блоки
		 */
		$aRepl = array_merge($aRepl,$modx->sbshop->multiarrayToPlaceholders(explode('<!-- ### -->',$modx->sbshop->oGeneralProduct->getAttribute('description')),'num','sb.description.'));
		/**
		 * Добавляем изображения
		 */
                $modx->sbshop->oGeneralProduct->unserializeImages($modx->sbshop->oGeneralProduct->getAttribute("id"));
		/**
		 * Подготавливает массив миниатюры
		 */

		$aImages = $modx->sbshop->oGeneralProduct->getAllImages();
		/**
		 * Переменная для блока миниатюр
		 */
		$sImages = '';
		/**
		 * Обрабатываем каждую картинку
		 */
                $i = 0;
		foreach ($aImages as $aImage) {
			/**
			 * Вставляем линк
			 */
                         if ($i==0){
                                $aRepl['[+sb.image.id+]']=$aImage['id'];
                                $aRepl['[+sb.image.title+]']=$aImage['title'];

                         }else{
                            $sImages .= str_replace(array('[+sb.image.id+]','[+sb.image.title+]'), array($aImage['id'],$aImage['title']), $this->aTemplates['thumbs_row']);                         
                         }
			$i++;
		}
		/**
		 * Вставляем картинки в контейнер
		 */
		$sImages = str_replace('[+sb.wrapper+]', $sImages, $this->aTemplates['thumbs_outer']);
		/**
		 * Добавляем в плейсхолдеры блок с миниатюрами
		 */
		$aRepl['[+sb.thumbs+]'] = $sImages;
		/**
		 * Переменная для опций
		 */
		$sOptions = '';
		/**
		 * Обрабатываем все опции
		 */
		$aOptions = $modx->sbshop->oGeneralProduct->getOptionNames();
		foreach ($aOptions as $aOption) {
			/**
			 * Если опция не является скрытой
			 */
			if(!$aOption['hidden']) {
				/**
				 * Значения
				 */
				$sOptRaw = '';
				/**
				 * Массив значений
				 */
				$aValues = $modx->sbshop->oGeneralProduct->getValuesByOptionName($aOption['title']);
				/**
				 * Если есть только одно значение
				 */
				if(count($aValues) == 1) {
					/**
					 *
					 */
					$aValue = array_pop($aValues);
					/**
					 * Создаем плейсхолдеры
					 */
					$aReplVal = $modx->sbshop->arrayToPlaceholders($aValue);
					/**
					 * Если значение равно null
					 */
					if($aReplVal['[+sb.value+]'] != 'null') {
						$aReplVal['[+sb.price+]'] = $aReplVal['[+sb.value+]'];
					} else {
						$aReplVal['[+sb.price+]'] = '';
					}
					$sOptRaw = str_replace(array_keys($aReplVal), array_values($aReplVal), $this->aTemplates['simple_option_row']);
				} else {
					/**
					 * Обрабатываем значения
					 */
					foreach ($aValues as $sValueKey => $sValueVal) {
						$aReplVal = $modx->sbshop->arrayToPlaceholders($sValueVal);
						if($aReplVal['[+sb.value+]'] != 'null') {
							$aReplVal['[+sb.price+]'] = $aReplVal['[+sb.value+]'];
						} else {
							$aReplVal['[+sb.price+]'] = '';
						}
						$sOptRaw .= str_replace(array_keys($aReplVal), array_values($aReplVal), $this->aTemplates['multi_option_row']);
					}
				}
				/**
				 * Плейсхолдеры для опции
				 */
				$aReplOpt['[+sb.wrapper+]'] = $sOptRaw;
				$aReplOpt = array_merge($aReplOpt,$modx->sbshop->arrayToPlaceholders($aOption,'sb.option.'));
				/**
				 * Заменяем
				 */
				$sOptions .= str_replace(array_keys($aReplOpt), array_values($aReplOpt), $this->aTemplates['option_outer']);
			}
		}
		/**
		 * Если опции есть
		 */
		if($sOptions != '') {
			/**
			 * Вставляем в общий контейнер
			 */
			$sOptions = str_replace('[+sb.wrapper+]',$sOptions,$this->aTemplates['options_outer']);
		}
		/**
		 * Добавляем плейсхолдер
		 */
		$aRepl['[+sb.options+]'] = $sOptions;
		/**
		 * Переменная для комплектаций
		 */
		$sBundlings = '';
		/**
		 * Получаем список комплектаций
		 */
		$aBundlings = $modx->sbshop->oGeneralProduct->getBundlingList();
		/**
		 * Если комплектации существуют
		 */
		if(count($aBundlings) > 0) {
			/**
			 * Обрабатываем каждую запись
			 */
			foreach ($aBundlings as $iBundlingId => $aBundling) {
				/**
				 * Если это индивидуальная комплектация
				 */
				if($aBundling['title'] === 'personal') {
					$iBundlingId = 'personal';
					$aBundling = array (
						'title' => $modx->sbshop->lang['bundling_personal_title'],
						'price' => $modx->sbshop->oGeneralProduct->getAttribute('price'),
						'options' => array(),
						'description' => $modx->sbshop->lang['bundling_personal_description'],
					);
				}
				/**
				 * Плейсхолдеры для замены
				 */
				/**
				 * Добавляем идентификатор в плейсхолдеры
				 */
				$aBundling['id'] = $iBundlingId;
				/**
				 * Массив опций в комплектации
				 */
				$aBundlingOptions = array();
				/**
				 * Обрабатываем список опций в комплектации
				 */
				foreach ($aBundling['options'] as $sOptionKey => $sOptionVal) {
					/**
					 * Если опция не является скрытой
					 */
					if(!$modx->sbshop->oGeneralProduct->isOptionHidden($sOptionKey)) {
						$aBundlingOptions[$sOptionKey] = $sOptionVal;
					}
				}
				/**
				 * Подготовка массива опций в JSON
				 */
				$aBundling['options.js'] = json_encode($aBundlingOptions);
				/**
				 * Если стоимость пустая
				 */
				if($aBundling['price'] === '') {
					/**
					 * Определяем стоимость по факту - товар + опции
					 */
					$aBundling['price'] = $modx->sbshop->oGeneralProduct->getAttribute('price') + $modx->sbshop->oGeneralProduct->getPriceByOptions($aBundling['options']);
				}
				/**
				 * Если это базовая комплектация
				 */
				if($iBundlingId == 'personal') {
					/**
					 * Отмечаем пукт как выбранный
					 */
					$aBundling['checked'] = 'checked="checked"';
				}
				/**
				 * Делаем набор плейсхолдеров
				 */
				$aBundlingRepl = $modx->sbshop->arrayToPlaceholders($aBundling,'sb.bundling.');
				/**
				 * Если опции в комплектации есть
				 */
				if(count($aBundling['options']) > 0) {
					/**
					 * Обрабатываем каждую опцию
					 */
					$aBundlOptions = array();
					foreach ($aBundling['options'] as $iOptKey => $iOptVal) {
						/**
						 * Плейсхолдеры для опций в коплектации
						 */
						$aOptionRepl = $modx->sbshop->arrayToPlaceholders($modx->sbshop->oGeneralProduct->getNamesByNameIdAndValId($iOptKey,$iOptVal));
						/**
						 * Разделитель между опцией и значением
						 */
						$aOptionRepl['[+sb.separator+]'] = $modx->sbshop->config['option_separator'];
						/**
						 * Если значение находится в списке скрываемых
						 */
						if(in_array($iOptVal, $modx->sbshop->config['hide_option_values'])) {
							/**
							 * Очищаем разделитель и значение
							 */
							$aOptionRepl['[+sb.value+]'] = '';
							$aOptionRepl['[+sb.separator+]'] = '';
						}
						/**
						 * Создаем ряд
						 */
						$aBundlOptions[] = str_replace(array_keys($aOptionRepl), array_values($aOptionRepl), $this->aTemplates['bundling_option_row']);
					}
					/**
					 * Если опции есть
					 */
					if(count($aBundlOptions) > 0) {
						/**
						 *
						 */
						$sBundlOptions = str_replace('<br>','',implode('',$aBundlOptions));
					} else {
						$sBundlOptions = '';
					}
					/**
					 * Устанавливаем
					 */
					$aBundlingRepl['[+sb.bundling.options+]'] = str_replace('[+sb.wrapper+]', $sBundlOptions, $this->aTemplates['bundling_option_outer']);
				} else {
					$aBundlingRepl['[+sb.bundling.options+]'] = '';
				}
				/**
				 * Добавляем ряд
				 */
				$sBundlings .= str_replace(array_keys($aBundlingRepl), array_values($aBundlingRepl), $this->aTemplates['bundling_row']);
			}
			/**
			 * Вставляем в контейнер и добавляем плейсхолдер
			 */
			$aRepl['[+sb.bundlings+]'] = str_replace('[+sb.wrapper+]', $sBundlings, $this->aTemplates['bundling_outer']);
		}
		/**
		 * Получаем набор характеристик
		 */
		$aAttributes = $modx->sbshop->oGeneralProduct->getExtendVisibleAttributes();
		/**
		 * Ряды значений
		 */
		$sAttrRows = '';
		/**
		 * Обрабатываем каждый параметр
		 */
		foreach ($aAttributes as $sAttrKey => $sAttrVal) {
			$aAttrRepl = array(
				'[+sb.title+]' => $sAttrKey,
				'[+sb.value+]' => $sAttrVal,
			);
			/**
			 * Формируем ряд
			 */
			$sAttrRows .= str_replace(array_keys($aAttrRepl), array_values($aAttrRepl), $this->aTemplates['attribute_row']);
		}
		/**
		 * Вставляем параметры в контейнер
		 */
		$aRepl['[+sb.attributes+]'] = str_replace('[+sb.wrapper+]', $sAttrRows, $this->aTemplates['attribute_outer']);

                /*
                 * Варианты
                 */

                $modx->sbshop->oGeneralProduct->oVariants->load($modx->sbshop->oGeneralProduct->getAttribute("id"));


                $sVariantsRows = $modx->sbshop->oGeneralProduct->oVariants->show_front();
                
                $aRepl['[+sb.variants+]'] = str_replace('[+sb.wrapper+]', $sVariantsRows, $this->aTemplates['variants_outer']);

		/**
		 * Если товар есть в наличии
		 */
		if($modx->sbshop->oGeneralProduct->getAttribute('existence')) {
			/**
			 * Делаем замену в основном шаблоне
			 */
			$sOutput .= str_replace(array_keys($aRepl),array_values($aRepl),$this->aTemplates['product']);
		} else {
			/**
			 * Делаем замену в основном шаблоне
			 */
			$sOutput .= str_replace(array_keys($aRepl),array_values($aRepl),$this->aTemplates['absent_product']);
		}
		/**
		 * Возвращаем результат
		 */
		return $sOutput;
	}
}

?>